package org.opencv.android;

import org.opencv.core.Core;

import java.util.StringTokenizer;
import android.util.Log;

class StaticHelper {

	public static boolean initOpenCV(boolean InitCuda) {
		boolean result;
		String libs = "";

		if (InitCuda) {
			loadLibrary("cudart");
			loadLibrary("nppc");
			loadLibrary("nppi");
			loadLibrary("npps");
			loadLibrary("cufft");
			loadLibrary("cublas");
		}

		Log.d(TAG, "Trying to get library list");

		try {
			System.loadLibrary("opencv_info");
			libs = getLibraryList();
		} catch (UnsatisfiedLinkError e) {
			Log.e(TAG, "OpenCV error: Cannot load info library for OpenCV");
		}

		Log.d(TAG, "Library list: \"" + libs + "\"");
		Log.d(TAG, "First attempt to load libs");
		if (initOpenCVLibs(libs)) {
			Log.d(TAG, "First attempt to load libs is OK");
			String eol = System.getProperty("line.separator");
			for (String str : Core.getBuildInformation().split(eol))
				Log.i(TAG, str);

			result = true;
		} else {
			Log.d(TAG, "First attempt to load libs fails");
			result = false;
		}

		return result;
	}

	private static boolean loadLibrary(String Name) {
		boolean result = true;

		Log.d(TAG, "Trying to load library " + Name);
		try {
			System.loadLibrary(Name);
			Log.d(TAG, "Library " + Name + " loaded");
		} catch (UnsatisfiedLinkError e) {
			Log.d(TAG, "Cannot load library \"" + Name + "\"");
			e.printStackTrace();
			result &= false;
		}

		return result;
	}

	private static boolean initOpenCVLibs(String Libs) {
		Log.d(TAG, "Trying to init OpenCV libs");

		boolean result = true;

		if ((null != Libs) && (Libs.length() != 0)) {
			Log.d(TAG, "Trying to load libs by dependency list");
			StringTokenizer splitter = new StringTokenizer(Libs, ";");
			while (splitter.hasMoreTokens()) {
				result &= loadLibrary(splitter.nextToken());
			}
		} else {
			// If dependencies list is not defined or empty.
			result &= loadLibrary("opencv_java3");
		}

		return result;
	}

	private static final String TAG = "OpenCV/StaticHelper";

	private static native String getLibraryList();
}
